#ifndef SC_ADB_DEVICE_H
#define SC_ADB_DEVICE_H

#include "common.h"

#include <stdbool.h>
/* stddef .h 头文件定义了各种变量类型和宏。这些定义中的大部分也出现在其它头文件中。 */
#include <stddef.h>

#include "util/vector.h"

// 一个安卓设备的基本信息
struct sc_adb_device {
    // 序列号：由 adb 创建的字符串，用于通过端口号唯一标识设备.示例：emulator-5554
    char *serial;

    /*
    device 状态：这个状态表示的是真机或者模拟器已经连接到了adb服务器上，但是并不代表我们已经可以对他们进行操作。
    offline 状态：表示真机或者模拟器没有连接到adb 服务器 或者是没有响应。
    no device 状态：这个在我这里是没有显示的，直接是空。从字面就可以理解，没有找到有用的设备。 
    */    
    char *state;

    // 设备的型号字符串    
    char *model;

    // 当前设备被选中，可用于投屏，只能有一个设备被选中    
    bool selected;
};

/* adb设备的类型，与连接方式相关 */
enum sc_adb_device_type {

        // USB 连接的设备
    SC_ADB_DEVICE_TYPE_USB,

        // TCPIP 连接的设备
    SC_ADB_DEVICE_TYPE_TCPIP,

        // emulator Android模拟器设备
    SC_ADB_DEVICE_TYPE_EMULATOR,
};

// 一组安卓设备,用来存储当前已经连接到电脑上的所有的android设备
struct sc_vec_adb_devices SC_VECTOR(struct sc_adb_device);

// 释放一个安卓设备的数据所占用的空间
// @param device 安卓设备指针
void
sc_adb_device_destroy(struct sc_adb_device *device);

/**
 * Move src to dst
 *
 * After this call, the content of src is undefined, except that
 * sc_adb_device_destroy() can be called.
 *
 * This is useful to take a device from a list that will be destroyed, without
 * making unnecessary copies.
 */
void
sc_adb_device_move(struct sc_adb_device *dst, struct sc_adb_device *src);

/* 
销毁一组安卓设备的数据
@param devices 一组安卓设备
*/
void
sc_adb_devices_destroy(struct sc_vec_adb_devices *devices);

/**
 * Deduce the device type from the serial。
 * 从设备序列号中推断出设备的类型
 * @param serial 设备序列号
 * @return 设备的类型
 */
enum sc_adb_device_type
sc_adb_device_get_type(const char *serial);

#endif
